// javamaps
// Copyright (c) 2010 Lup Gratian
package Rendering.Utils;
import Core.*;
import java.util.*;

public final class Cache<T> {
    class ObjectMap<K, V> extends LinkedHashMap<K, V> {
        private final int capacity_;
        
        public ObjectMap(int capacity) {
            super(capacity, 0.75f, true /* access order */);
            capacity_ = capacity;
        }

        @Override
        protected boolean removeEldestEntry(Map.Entry eldest) {
            // Daca cache-ul este plin ultimul element accesat este eliminat.
            return size() > capacity_;
        }
    }

    /*
     * Membrii.
     */
    private ObjectMap<ObjectId, T> items_;

    /*
     * Constructori.
     */
    public Cache(int capacity) {
        items_ = new ObjectMap(capacity);
    }

    /*
     * Metode publice.
     */
    // Adauga un obiect in cache. Daca nu mai este loc ultimul
    // obiect care a fost accesat este eliminat.
    public synchronized void Add(T item, ObjectId id) {
        if(items_.containsKey(id)) return;
        items_.put(id, item);
    }

    // Obtine un obiect din cache pe baza ID-ului.
    // Daca obiectul nu este gasit se returneaza null.
    public synchronized T Get(ObjectId id) {
        return items_.get(id);
    }

    // Verifica daca un obiect cu ID-ul dat se gaseste in cache.
    public synchronized boolean Contains(ObjectId id) {
        return items_.containsKey(id);
    }

    public synchronized void Remove(ObjectId id) {
        items_.remove(id);
    }

    // Sterge toate obiectele din cache.
    public synchronized void Clear() {
        items_.clear();
    }

    public synchronized int Capacity() { return items_.capacity_; }
    public synchronized int Count() { return items_.size(); }
}